/**
 @file packet_def.h
 @brief Definicion de los tipos de tramas API XBee y sus estructuras de datos.
 @date   06/11/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef PACKET_DEF_H_
#define PACKET_DEF_H_
#include <inttypes.h>


//Tipos de tramas API que se pueden enviar

#define TX_REQUEST_64 0x00
#define TX_REQUEST_16 0x01
#define AT_COMMAND 0x08
#define AT_COMMAND_QUEUE 0x09
#define AT_COMMAND_REMOTE_REQUEST 0x17

//Tipos de tramas API que se pueden recibir

#define RX_16_RESPONSE 0x81
#define RX_64_RESPONSE 0x80
#define RX_16_IO_RESPONSE 0x82
#define RX_64_IO_RESPONSE 0x83
#define AT_COMMAND_RESPONSE 0x88
#define TX_STATUS_RESPONSE 0x89
#define MODEM_STATUS_RESPONSE 0x8A
#define AT_REMOTE_RESPONSE 0x97

//! @brief Estructura para la recepción de tramas con dirección de 64 bits
typedef struct {

    uint64_t sourceAddress; //!< Dirección de origen de 64 bits
    uint8_t RSSI; //!< Potencia de la señal cuando la trama fué recibida
    uint8_t options; //!< Byte de opciones de la trama (address broadcast, PAN broadcast)
    uint8_t * data; //!< Buffer que contiene la data
    uint8_t dataSize; //!< Número de bytes presentes en el buffer

} xbee_RxFrame64_t;

//! @brief Estructura para la recepción de tramas con dirección de 16 bits
typedef struct {

    uint16_t sourceAddress; //!< Dirección de origen de 16bits
    uint8_t RSSI; //!< Potencia de la señal cuando la trama fué recibida
    uint8_t options; //!< Byte de opciones de la trama (address broadcast, PAN broadcast)
    uint8_t * data; //!< Buffer que contiene la data
    uint8_t dataSize; //!< Número de bytes presentes en el buffer

} xbee_RxFrame16_t;

//! @brief Estructura para el envío de tramas con dirección de 64bits
typedef struct {

    uint8_t frameId; //!< identificador de trama
    uint64_t destinationAddress; //!< Dirección de destino de 64bits
    uint8_t options; //!< Byte de opciones (desactivar ACK, PAN broadcast)
    uint8_t * data; //!< Buffer que contiene la data a enviar
    uint8_t dataSize; //!< Número de bytes presentes en el buffer

} xbee_TxFrame64_t;

//! @brief Estructura para el envío de tramas con dirección de 16bits
typedef struct {

    uint8_t frameId; //!< identificador de trama
    uint16_t destinationAddress; //!< Dirección de destino de 16bits
    uint8_t options; //!< Byte de opciones (desactivar ACK, PAN broadcast)
    uint8_t * data; //!< Buffer que contiene la data a enviar
    uint8_t dataSize; //!< Número de bytes presentes en el buffer

} xbee_TxFrame16_t;

//! @brief Estructura para la indicación de status de transmisión
typedef struct {

    uint8_t frameId; //!< identificador de la trama reportada
    uint8_t status; //!< status de la transmisión

} xbee_TxStatus_t;

//! @brief Estructura de una trama de status del módulo
typedef struct {

    uint8_t status; //!< Estado del módulo (hardware reset, watchdog timer reset, associated, disassociated, sync lost, coordinator realignement, coordinator started)

} xbee_ModemStatus_t;

//! @brief Estructura para la ejecución de un comando AT local
typedef struct {

    uint8_t frameId; //!< identificador de trama, 0 implica no recibir respuesta
    char command[2]; //!< Los caracteres que designan el comando
    uint8_t * parameter; //!< Apuntador al valor del parámetro a asignar, 0 para lectura
    uint8_t parameterSize; //!< Tamaño del parámetro a asignar

} xbee_AtCommand_t;

//! @brief Estructura para almacenar la respuesta a un comando AT local
typedef struct {

    uint8_t frameId; //!< identificador de la solicitud
    char command[2]; //!< comando que se envió
    uint8_t status; //!< Estado de la ejecución, 0 = OK, 1 = ERROR
    uint8_t valueSize; //!< Tamaño de la respuesta
    uint8_t value[31]; //!< buffer almacenando el valor del parámetro consultado

} xbee_AtCommandResponse_t;

//! @brief Estructura para ejecutar un comando AT remoto
typedef struct {

    uint8_t frameId; //!< identificador de trama, 0 implica no recibir respuesta
    uint16_t destinationAddress16; //!< dirección de destino de 16 bits
    uint64_t destinationAddress64; //!< dirección de destino de 64 bits
    uint8_t options; //- opciones. 0x02 si el cambio se aplica inmediatamente, de lo contrario se requiere enviar AC y WR
    char command[2]; //!< los 2 caracteres que designan al comando
    uint8_t valueSize; //!< tamaño del parámetro a asignar
    uint8_t * value; //!< Apuntador al valor del parámetro a asignar, 0 para lectura.

} xbee_AtRemote_t;

//! @brief Estructura para almacenar la respuesta a un comando AT remoto
typedef struct  xbee_AtRemoteResponse{

    uint8_t frameId; //!< identificador de la solicitud
    uint64_t sourceAddress64; //!< dirección de origen de 64 bits
    uint16_t sourceAddress16; //!< dirección de origen de 16 bits
    char command[2]; //!< comando que se envió
    uint8_t status; //!< estado de la solicitud, 0 = OK, 1 = ERROR
    uint8_t valueSize; //!< Tamaño de la respuesta
    uint8_t value[20]; //!< valor del parámetro consultado

} xbee_AtRemoteResponse_t;

//--------utility functions
void print_tx_64(xbee_TxFrame64_t packet64);

void print_tx_16(xbee_TxFrame16_t packet16);

void print_AT_remote_request(xbee_AtRemote_t at_request);

void print_AT_request(xbee_AtCommand_t command);

void print_AT_remote_response(xbee_AtRemoteResponse_t at_remoteresponse);

void print_AT_response(xbee_AtCommandResponse_t at_response);

void print_rx_64(xbee_RxFrame64_t packet64);

void print_rx_16(xbee_RxFrame16_t packet16);

void print_tx_status(xbee_TxStatus_t tx_response);

#endif /* PACKET_DEF_H_ */
